Question ADSI, DirectoryEntry et {System.__ComObject}

Plus d'informations
il y a 16 ans 4 mois #5646 par clem
Bonsoir,

J'essai de me connecter sur un objet de l'ad avec :

[code:1]$userpath = \"LDAP://CN=testuser,OU=Domain Admins,DC=mondomaine,DC=local\"
$CreatedUser = [ADSI]$userpath[/code:1]

J'essai de recuperer, en vain, la date d'expiration du compte contenue dans la propriété 'accountexpires' ( de type {System.__ComObject} )

Le but est de créer un nouvel objet PSObject, qui contiendra les valeurs de certains attributs d'un compte Active directory :

[code:1]function MakeObject {

param (
$Firstname,
$LastName,
$DisplayName,
$Mail,
$CreationDate,
$Department,
$City,
$Manager,
$Title,
$Description,
$ExpirationDate,
$PersonalFolder,
$DistinguishedName,
$HomeMDB
)

$svrObj = New-Object PSObject
$svrObj | Add-Member NoteProperty \"Firstname\" \"$Firstname\"
$svrObj | Add-Member NoteProperty \"LastName\" \"$LastName\"
$svrObj | Add-Member NoteProperty \"DisplayName\" \"$DisplayName\"
$svrObj | Add-Member NoteProperty \"Mail\" \"$Mail\"
$svrObj | Add-Member NoteProperty \"CreationDate\" \"$CreationDate\"
$svrObj | Add-Member NoteProperty \"Department\" \"$Department\"
$svrObj | Add-Member NoteProperty \"City\" \"$City\"
$svrObj | Add-Member NoteProperty \"Manager\" \"$Manager\"
$svrObj | Add-Member NoteProperty \"Title\" \"$Title\"
$svrObj | Add-Member NoteProperty \"Description\" \"$Description\"
$svrObj | Add-Member NoteProperty \"ExpirationDate\" \"$ExpirationDate\"
$svrObj | Add-Member NoteProperty \"PersonalFolder\" \"$PersonalFolder\"
$svrObj | Add-Member NoteProperty \"DistinguishedName\" \"$DistinguishedName\"
$svrObj | Add-Member NoteProperty \"HomeMDB\" \"$HomeMDB\"

##more fields here..
write-output $svrObj

}[/code:1]

Puis d'ajouter le contenu dans un fichier csv existant :

[code:1]$userpath = \"LDAP://CN=testuser,OU=Domain Admins,DC=mondomaine,DC=local\"
$CreatedUser = [ADSI]$userpath

$report = \"C:\Powershell\Scripts\projet user creation eutelsat\1.0\Logs\UserCreationReport_$((Get-Date).year).csv\"

# si un fichier de log à été trouvé
if (Test-Path $report)
{
# on importe le fichier csv
Write-Host \"fichier log existe\"
[System.Object[]]$users = Import-Csv $report
}
else
{
# Write-Host \"fichier log n'existe pas\"
$users = @()
}

#ajout de l'objet au contenu du fichier csv
$users += MakeObject -Firstname $CreatedUser.givenname -LastName $CreatedUser.sn -DisplayName $CreatedUser.DisplayName `
-Mail $CreatedUser.mail -CreationDate $CreatedUser.whencreated -Department $CreatedUser.Department `
-City $CreatedUser.l -Manager $CreatedUser.Manager -Title $CreatedUser.Title -Description $CreatedUser.Description`
-ExpirationDate $CreatedUser.accountExpires -PersonalFolder \"\\server\users\monuser\" `
-DistinguishedName $CreatedUser.DistinguishedName -HomeMDB $CreatedUser.HomeMDB

# export vers le fichier csv
$users | Export-csv -Path $report -NoTypeInformation -Force

Invoke-Item $report[/code:1]

$CreatedUser.accountExpires est de type [System.__ComObject] et je n'arrive pas à en récuperer le contenu.

J'ai cru comprendre qu'une solution de conversion existait avec le framework mais je n'ai pas reussi à l'appliquer

Je pourrais utiliser cette solution :

[code:1]$searcher = New-Object DirectoryServices.DirectorySearcher
$searcher.filter = \"(&(samaccountname=testuser))\"
$results = $searcher.findone()
$results.properties.accountexpires
[datetime]::fromfiletime($results.properties.accountexpires[0])
[/code:1]
Mais jaimerai pouvoir utiliser la premiere methode en me connectant sur l'objet avec son chemin LDAP

Pourriez vous m'aider à accéder a cet objet de type{System.__ComObject} svp

Merci.

Clément

Message édité par: clem, à: 16/11/09 22:12<br><br>Message édité par: clem, à: 17/11/09 12:18

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5648 par Laurent Dardenne
Salut,
as-tu essayé ceci :
[code:1]$CreatedUser.InvokeGet('accountExpires')
#ou
$CreatedUser.Psbase.InvokeGet('accountExpires')
[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5653 par clem
Bonjour Laurent,

[code:1]$CreatedUser.InvokeGet('accountExpires') [/code:1]:

Exception lors de l'appel de « InvokeGet » avec « 1 » argument(s) : « Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) »
à : ligne:48 caractère:27
+ $a = $CreatedUser.InvokeGet &lt;&lt;&lt;&lt; ('accountExpires')



Et :

[code:1]$a = $CreatedUser.Psbase.InvokeGet('accountExpires')
$a[/code:1]

$a ne renvoit rien hélas



Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5656 par Laurent Dardenne
clem écrit:

$a ne renvoit rien

As-tu vérifier avec l'autre approche ? Le champ est peut-être vide.
Sinon une dernière piste :
[code:1]
$Res=[System.__ComObject].InvokeMember(\&quot;accountexpires\&quot;,[System.Reflection.BindingFlags]::GetProperty,$null,$CreatedUser.psbase.NativeObject,$null)
[/code:1]

clem écrit:

Mais j'aimerai pouvoir utiliser la premiere methode en me connectant sur l'objet avec son chemin LDAP

Il est peut être possible de coder une fonction en utilisant ce constructeur .

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5660 par Arnaud Petitjean
Bonsoir à tous,

J'ai essayé ce que tu proposes Laurent mais sans succès non plus; ça retourne toujours la valeur System.__ComObject.

Ca doit venir du fait que le support d'ADSI avec le moniker LDAP est relativement moyen... :whistle:

Ceci dit j'ai quand même réussi à trouver une solution de contournement en utilisant le moniker WinNT.

Exemple :

[code:1]
$objUser=[ADSI]'WinNT://./Bracame,user'
PS &gt; $objUser.AccountExpirationDate

vendredi 18 décembre 2009 00:00:00

[/code:1]

[code:1]PS &gt; $objUser | Format-List *


UserFlags : {545}
AccountExpirationDate : {18/12/2009 00:00:00}
MaxStorage : {-1}
PasswordAge : {450478}
PasswordExpired : {0}
LoginHours : {255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255}
FullName : {}
Description : {Compte utilisateur}
BadPasswordAttempts : {0}
LastLogin : {12/11/2009 18:13:53}
HomeDirectory : {\\srvfic1\users\Bracame}
LoginScript : {login.vbs}
Profile : {}
HomeDirDrive : {L:}
Parameters : {}
PrimaryGroupID : {513}
Name : {Bracame}
MinPasswordLength : {7}
MaxPasswordAge : {3628800}
MinPasswordAge : {86400}
PasswordHistoryLength : {24}
AutoUnlockInterval : {1800}
LockoutObservationInterval : {1800}
MaxBadPasswordsAllowed : {0}
objectSid : {1 5 0 0 0 0 0 5 21 0 0 0 188 63 244 59 115 126 5 127 14 125 224 104 153 4 0 0}
AuthenticationType : Secure
Children : {}
Guid : {D83F1060-1E71-11CF-B1F3-02608C9E7553}
ObjectSecurity :
NativeGuid : {D83F1060-1E71-11CF-B1F3-02608C9E7553}
NativeObject : System.__ComObject
Parent : WinNT://powershell-scripting.com/.
Password :
Path : WinNT://./Bracame,user
Properties : {UserFlags, AccountExpirationDate, MaxStorage, PasswordAge...}
SchemaClassName : User
SchemaEntry : System.DirectoryServices.DirectoryEntry
UsePropertyCache : True
Username :
Options :
Site :[/code:1]

Donc moralité, mieux vaut peut-être pour ce script mettre de côté le moniker LDAP. Ou alors au contraire jouer avec les 2 si des propriétés ne sont pas disponibles avec l'un mais disponibles avec l'autre.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.077 secondes
Propulsé par Kunena